# 编译器
CC = gcc

# 编译选项
# -g: 添加调试信息
# -Wall: 显示所有警告
CFLAGS = -g -Wall

# 链接选项
# -pthread: 编译和链接 POSIX 线程库 (通常优于仅用 -lpthread)
LDFLAGS = -pthread

# 目标可执行文件名
TARGET = reader_writer

# 源文件列表 (.c 文件)
SRCS = mainProg_rw.c ReaderWriterUtilities.c Reader.c Writer.c

# 头文件列表 (.h 文件) - 用于更精确的依赖关系
HDRS = ReaderWriterUtilities.h Reader.h Writer.h

# 根据源文件列表自动生成目标文件列表 (.o 文件)
OBJS = $(SRCS:.c=.o)

# 默认目标：生成可执行文件
all: $(TARGET)

# 链接规则：如何从目标文件生成最终的可执行文件
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) -o $(TARGET) $(LDFLAGS)

# 编译规则：如何从 .c 文件生成 .o 文件
# $< 代表第一个依赖文件 (即 .c 文件)
# $@ 代表目标文件 (即 .o 文件)
# 添加对 HDRS 的依赖，确保头文件更改会触发重新编译
# 注意：更精确的依赖可以为每个 .o 文件单独指定其依赖的 .h 文件，
# 但对于这个规模的项目，依赖所有头文件通常足够。
%.o: %.c $(HDRS)
	$(CC) $(CFLAGS) -c $< -o $@

# 清理规则：删除生成的目标文件和可执行文件
clean:
	rm -f $(OBJS) $(TARGET)

# 声明 all 和 clean 为伪目标
.PHONY: all clean
